package com.sugar.queryinfo.module.business.util;

import cn.hutool.core.img.Img;
import cn.hutool.core.img.ImgUtil;
import lombok.extern.slf4j.Slf4j;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * @author Ysugar
 */
@Slf4j
public class SqBookUtil {
    public static byte[] generateTagPng(String name, String idCard, String date) {
        try {
            // 背景图宽高
            int backWidth = 800;
            int backHeight = 850;

            // 设置边距
            int margin = 20;

            // 计算内容的最大宽度
            int contentMaxWidth = backWidth - margin * 2;

            // 创建背景白板图 -start
            BufferedImage backImage = new BufferedImage(backWidth, backHeight, BufferedImage.TYPE_INT_ARGB);
            // 获取 Graphics2D 对象
            Graphics2D backG2d = backImage.createGraphics();
            // 开启抗锯齿
            backG2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            // 设置背景颜色为白色
            backG2d.setColor(Color.WHITE);
            // 填充整个图像背景
            backG2d.fillRect(0, 0, backWidth, backHeight);
            // 创建背景白板图 -end

            // 设置画布字体颜色
            backG2d.setColor(Color.BLACK);

            // 将背景图 BufferedImage 转为 Img 对象
            //Img backImg = Img.from(backImage).setPositionBaseCentre(false);

            // 绘制文本
            int nameY = margin + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            int newY = drawStringWithWrapping(backG2d, "本人姓名：" + name, margin, nameY, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 17;

            // 绘制文本
            int idCardY = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "身份证号：" + idCard, margin, idCardY, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 17;

            // 绘制文本
            int line0Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "因本人申请融资担保业务所需，故向贵公司作出以下授权：", margin, line0Y, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 34;

            // 绘制文本
            int line1Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "一、本人经充分了解相关法律法规，同意授权贵公司通过第三方机构（包括但不限于 朴道征信有限公司等征信机构）或指定第三方收集本人的个人信息（包括但不限于本人公民身份信息、联系方式、个人征信记录等），授权期至本人业务结清之日止，本人同意所收集的本人信息可用于个人办理业务申请、对已发放的业务进行业务前后风险管理及风险评估与控制。", margin, line1Y, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 34;

            // 绘制文本
            int line2Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "二、本人同意朴道征信有限公司（联系方式：service@pudaocredit.cn ）基于为本人与贵公司之间的金融活动提供信用服务的目的，可向贵公司和有关部门、单位（包括但不限于公安、司法、教育、全国公民身份证号码查询服务中心、通信运营商、银联、通联、易宝、宝付、社保、公积金、税务、民政、物流、电子商务平台、互联网平台、行业协会等合法留存本人信息的第三方机构等）查询、核实、采集、整理、保存、加工本人能够用于判断个人信用状况的各类信息（包括但不限于个人的身份、地址、交通、通信、债务、财产、支付、消费、生产经营、履行法定义务等信息，以及基于前述信息对个人信用状况形成的分析、评价类信息），包括可能对本人产生负面影响的不良信息，并可将上述信息在本授权书所列的用途范围内向贵公司提供。上述信息的保存期限为法律法规要求的最短时间，其中个人不良信息的保存期限为自不良行为或事件终止之日起5年。", margin, line2Y, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 34;

            // 绘制文本
            int line3Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "三、本人同意授权合法存有本人信息的机构向第三方机构（包括但不限于征信机构）提供本人的上述信息。", margin, line3Y, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 34;

            // 绘制文本
            int line4Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "特别声明：本人已知悉本授权书全部内容（特别是加粗字体内容）的含义及因此产生的法律效力，自愿做出以上授权。本授权书是本人真实意思表示，本人同意承担由此带来的一切法律后果。", margin, line4Y, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 34;

            // 绘制文本
            int line5Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "特别提示：本授权书效力具有独立性，不因相关业务合同或条款无效或被撤销而无效或失效，本授权一经作出，便不可撤销。为了保障您的合法权益，您应当阅读并遵守本授权书。请您务必审慎阅读，并充分理解本授权书的全部内容，特别是以加粗形式提示您注意的。若您不接受本授权书的任何条款，请您立即停止授权。", margin, line5Y, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 34;

            // 绘制文本
            int line6Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "授权人：" + name, margin, line6Y, contentMaxWidth, Font.PLAIN, 17);

            // 写出空行
            newY = newY + 17;

            // 绘制文本
            int line7Y = newY + 17; // 这里Y轴需要加字体高度，因为字体，是根据左下角为原点的
            newY = drawStringWithWrapping(backG2d, "授权日期：" + date, margin, line7Y, contentMaxWidth, Font.PLAIN, 17);


            // 根据占用的实际高度裁剪
            BufferedImage croppedImage = backImage.getSubimage(0, 0, backWidth, backHeight);
            // 完成绘制并释放资源
            backG2d.dispose();

            // 将背景图 BufferedImage 转为 Img 对象
            Img croppedbackImg = Img.from(croppedImage).setPositionBaseCentre(false);
            Image imageFile = croppedbackImg.getImg();

            return ImgUtil.toBytes(imageFile, ImgUtil.IMAGE_TYPE_PNG);
        }catch (Throwable e){
            log.error("生成二维码失败：", e);
            return null;
        }
    }


    private static int drawStringWithWrapping(Graphics2D g2d, String text, int x, int y, int maxWidth, int style, int fontSize) {
        Font font = new Font("Serif", style, fontSize);
        g2d.setFont(font);
        FontMetrics fm = g2d.getFontMetrics();

        StringBuilder currentLine = new StringBuilder();
        char[] chars = text.toCharArray(); // 将文本拆分为字符数组

        for (char c : chars) {
            // 将字符添加到当前行
            currentLine.append(c);

            // 检查当前行的宽度是否超出最大宽度
            if (fm.stringWidth(currentLine.toString()) > maxWidth) {
                // 如果超出最大宽度，则绘制当前行并换行
                g2d.drawString(currentLine.substring(0, currentLine.length() - 1), x, y);  // 不绘制超出部分
                currentLine.setLength(0);  // 清空当前行
                currentLine.append(c);  // 当前字符放入下一行
                y += fm.getHeight();  // 换行
            }
        }

        // 绘制最后一行
        if (currentLine.length() > 0) {
            g2d.drawString(currentLine.toString(), x, y);
        }

        return y;
    }
}
